package com.estore.model;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

/**
 * 商品实体类：仅存储商品数据，不包含业务逻辑
 */
public class Product implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;      // 商品ID
    private String name;    // 商品名称
    private double price;   // 价格
    private int stock;      // 库存
    private Set<String> tags; // 商品标签集合


    // 带标签的构造器
    public Product(String id, String name, double price, int stock, Set<String> tags) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.stock = stock;
        // 非空校验：若传入null则初始化为空HashSet
        this.tags = (tags == null) ? new HashSet<>() : new HashSet<>(tags);
    }

    // 不带标签的构造器（自动初始化空标签）
    public Product(String id, String name, double price, int stock) {
        this(id, name, price, stock, null);
    }


    // Getter方法
    public String getId() { return id; }
    public String getName() { return name; }
    public double getPrice() { return price; }
    public int getStock() { return stock; }
    public Set<String> getTags() {
        // 返回新集合，避免外部修改内部数据
        return new HashSet<>(tags);
    }

    // Setter方法（仅开放tags的修改）
    public void setTags(Set<String> tags) {
        this.tags = (tags == null) ? new HashSet<>() : new HashSet<>(tags);
    }


    // 重写toString：包含标签信息
    @Override
    public String toString() {
        String tagStr = tags.isEmpty() ? "无" : tags.toString();
        return String.format("ID: %-5s | 名称: %-20s | 价格: ¥%-8.2f | 库存: %d | 标签: %s",
                id, name, price, stock, tagStr);
    }


    // 重写equals和hashCode：按ID判断商品唯一性
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return Objects.equals(id, product.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
